package com.thx.information.service;

import com.thx.common.service.BaseManager;
import com.thx.information.dao.InfomationDao;
import com.thx.information.model.InfoCommentLog;
import com.thx.information.model.InfoVoteItem;
import com.thx.information.model.Information;
import com.thx.information.view.InformationView;
import com.thx.information.view.VoteItemLogView;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Service
@Transactional(readOnly = true)
public class InfomationService extends BaseManager<Information> {

  private static final Logger logger = LoggerFactory.getLogger(InfomationService.class);

  @Autowired
  private InfomationDao infomationDao;

  @Autowired
  private InformationExtService informationExtService;

  @Autowired
  private CommentLogService commentLogService;

  @Autowired
  private InfoVoteItemService infoVoteItemService;

  @Autowired
  private InfoVoteLogService infoVoteLogService;

  // public Page<Information> queryAll(Information info, Page<Information> page) {
  // page.setResult(infomationDao.queryAll(info, page.getStart(), page.getMax()));
  // page.setCount(infomationDao.queryCount(info));
  // return page;
  // }
  //
  // /**
  // * 查询该企业所有的公告和平台公告 建立日期 : Apr 23, 2013 5:41:50 PM<br>
  // * 作者 : 贺晋恩<br>
  // *
  // * @return
  // */
  // public Page<Information> queryAllAndCommon(Information entity, Page<Information> page) {
  // page.setResult(infomationDao.queryAllAndCommon(entity, page.getStart(), page.getMax()));
  // page.setCount(infomationDao.queryCountAndCommon(entity));
  // return page;
  // }
  //
  // /**
  // *
  // * @author zhangyong
  // * @date 2014-11-22 下午10:19:17
  // * @param entity
  // * @return
  // */
  // public List<Information> queryAllAndCommon(Information entity) {
  // return infomationDao.queryAllAndCommon(entity);
  // }
  //
  //
  //
  // /**
  // * 查询公告信息、投票信息、评论信息 建立日期 : Apr 26, 2013 5:41:50 PM<br>
  // * 作者 : wangamin<br>
  // *
  // * @param entity
  // * @return
  // */
  // public InfomationVoteCommentLogView queryDetail(Information entity) {
  // InfomationVoteCommentLogView view = new InfomationVoteCommentLogView();
  // Information info = infomationDao.get(entity.getInfoId());
  // List<InfoVoteItem> votesList = infovoteDao.queryVote(entity.getInfoId());
  // List<InfoVoteItem> vList = new ArrayList<InfoVoteItem>();
  // if (votesList != null) {
  // for (InfoVoteItem i : votesList) {
  // InfoVoteItem in = new InfoVoteItem();
  // in.setTotal(Long.valueOf(infovoteLogDao.queryCountByItemId(i.getVoteItemId())));
  // in.setInfoId(i.getInfoId());
  // in.setOptionName(i.getOptionName());
  // in.setVoteItemId(i.getVoteItemId());
  // vList.add(in);
  // }
  // }
  // // 查询浏览次数
  // Long viewCount = informationExtDao.queryViewCountByInfoId(entity.getInfoId());
  // info.setViewCount(viewCount);
  //
  // List<InfoCommentLog> commentLogList = commonLogDao.queryComment(entity.getInfoId());
  // view.setInformation(info);
  // view.setInfoCommentLog(commentLogList);
  // view.setInfoVoteItem(vList);
  // return view;
  // }



  // /**
  // * 查询公司新闻信息 建立日期 : May 18, 2013 5:41:50 PM<br>
  // * 作者 : wangamin<br>
  // *
  // * @param valueOf
  // * @return
  // */
  // public List<Information> queryInfo(Information info) {
  // return infomationDao.queryInfo(info);
  // }
  //

  //
  // /**
  // * @author 贺晋恩
  // * @date 2013-8-7 下午4:21:22
  // * @param informationView
  // * @param start
  // * @param max
  // * @return
  // */
  // public List<Information> queryAll(Information informationView, int start, int max) {
  // return this.infomationDao.queryAll(informationView, start, max);
  // }

  /**
   * 分页查询信息列表.
   * 
   * @param enterpriseId
   * @param personnelId
   * @param platformInfoId
   * @param issueStatus
   * @param infoTitle
   * @param readStatus
   * @return
   */
  public List<InformationView> findEnterpriseAndCommon(Long enterpriseId, Long personnelId,
      Long columnId, Long infoId, String infoType, String infoTitle, String issueStatus,
      String readStatus) {
    List<InformationView> result = new ArrayList();
    List<Information> list = infomationDao.findEnterpriseAndCommon(enterpriseId, personnelId,
        columnId, infoId, infoType, infoTitle, issueStatus, readStatus);
    this.generateViews(result, list);
    return result;
  }


  /**
   * 按企业租户Id、创建时间查询所有最新的栏目分类.
   * 
   * @param enterpriseId 所属企业租户Id,不能为空
   * @param startDate 创建时间开始范围,不能为空
   * @return 所有最新的栏目分类
   */
  public List<Long> findAllNewest(Long enterpriseId, Date startDate) {
    return infomationDao.findAllNewest(enterpriseId, startDate, 1L);
  }

  /**
   * 根据时间和企业ID查询.
   * 
   * @param entId 所属企业租户Id,不能为空
   * @param startDate 开始查询时间,不能为空
   * @param endDate 结束查询时间,不能为空
   * @return 信息数量
   */
  public int queryByEntId(Long entId, Date startDate, Date endDate) {
    return infomationDao.findCountByEnterpriseIdAndIntervalTime(entId, startDate, endDate);
  }

  /**
   * 查询主页平台公告信息.
   * 
   * @param info
   * @return
   */
  public List<InformationView> queryPlatform(Information info) {
    List<InformationView> result = new ArrayList();
    List<Information> list = infomationDao.findByColumnIdAndIssueStatus(info.getColumnId(), 1L);
    this.generateViews(result, list);
    return result;
  }

  /**
   * 根据信息id返回信息视图对象.
   * 
   * @param infoId 信息id,不能为空
   * @return 信息视图对象
   */
  public InformationView findViewByInfoId(Long infoId) {
    InformationView result = new InformationView();
    Information information = this.get(infoId);
    if (information != null) {
      result.setInformation(information);

      // 设置浏览次数
      Long viewCount = informationExtService.queryViewCountByInfoId(information.getInfoId());
      result.setViewCount(viewCount);

      // 设置关联评论数据
      List<InfoCommentLog> comments = commentLogService.findByInfoId(infoId);
      result.setInfoCommentLog(comments);

      // 设置评论总数量
      int commentsNum = commentLogService.queryCountByInfoId(infoId);
      result.setCommentsNum(commentsNum);

      // 设置关联投票项数据
      List<VoteItemLogView> voteitems = infoVoteItemService.queryVoteItemLogView(infoId);
      result.setInfoVoteItemLog(voteitems);

      // 设置投票总人数
      Long vote = infoVoteLogService.queryCount(infoId);
      int voteJoinNum = vote!=null && vote!=0L ? vote.intValue() : 0;
      result.setVoteJoinNum(voteJoinNum);
    }
    return result;
  }

  /**
   * 根据栏目id删除公告.
   * 
   * @param columnId 所属栏目Id,不能为空
   */
  @Transactional(readOnly = false)
  public void deleteByColumnId(Long columnId) {
    // 删除栏目下所有公告基本信息
    infomationDao.deleteByColumnId(columnId);
    // TODO 删除栏目下所有公告的扩展信息
    // TODO 删除栏目下所有公告的附件信息
  }

  /**
   * 发布信息.
   * 
   * @param infoId 信息Id,不能为空
   */
  @Transactional(readOnly = false)
  public void issueInformation(Long infoId) {
    infomationDao.setInformationIssueStatus(infoId, 1L);
  }

  /**
   * 撤销信息.
   * 
   * @param infoId 信息Id,不能为空
   */
  @Transactional(readOnly = false)
  public void cancelInformation(Long infoId) {
    infomationDao.setInformationIssueStatus(infoId, 0L);
  }

  /**
   * 结束信息投票状态.
   * 
   * @param infoId 信息Id,不能为空
   */
  @Transactional(readOnly = false)
  public void finishVote(Long infoId) {
    infomationDao.setInformationVoteStatus(infoId, "0");
  }

  /**
   * 开始信息投票状态.
   * 
   * @param infoId 信息Id,不能为空
   */
  @Transactional(readOnly = false)
  public void startVote(Long infoId) {
    infomationDao.setInformationVoteStatus(infoId, "1");
  }

  /**
   * 保存信息和投票条目信息
   * 
   * @param information
   * @param votemItems
   */
  @Transactional(readOnly = false)
  public void saveInformationAndVoteItems(Information information, List<InfoVoteItem> votemItems) {
    Long id = information.getInfoId();
    if (id != null && id != 0L) {
      infomationDao.save(information);
      if (votemItems != null && votemItems.size() != 0) {
        for (InfoVoteItem item : votemItems) {
          item.setInfoId(information.getInfoId());
          infoVoteItemService.save(item);
        }
      }
    }
  }

  /**
   * 创建信息视图对象
   * 
   * @param result
   * @param list
   */
  private void generateViews(List<InformationView> result, List<Information> list) {
    if (list != null && list.size() != 0) {
      for (Information information : list) {
        InformationView view = new InformationView();
        view.setInformation(information);
        Long viewCount = informationExtService.queryViewCountByInfoId(information.getInfoId());
        view.setViewCount(viewCount);
        result.add(view);
      }
    }
  }
}
